package main

import (
	"fmt"
)

// 定义一个数据写入器
type DataWriter interface {
	WriteData(data interface{}) error
}

// 定义文件结构，用于实现DataWriter
type file struct {
}

// 实现DataWriter接口的WriteData方法
// (d *file)说明这是file 的方法，这个方法签名刚好和DataWriter 这个接口的其中一个方法签名相同，
// 那么就说明这个结构体实现了这个接口方法,但也只是实现了一个方法而已，不能说这个结构体实现了这个接口，
// 因为这个接口可能不止这一个方法。结构体必须是实现了这个接口的所有方法才能说实现了这个接口
func (d *file) WriteData(data interface{}) error {

	// 模拟写入数据
	fmt.Println("WriteData:", data)
	return nil
}

func main() {

	// 实例化file
	f := new(file)

	// 声明一个DataWriter的接口
	var writer DataWriter

	// 将接口赋值f，也就是*file类型
	//将 *file 类型的 f 赋值给 DataWriter 接口的 writer，虽然两个变量类型不一致。
	//但是 writer 是一个接口，且 f 已经完全实现了 DataWriter() 的所有方法，因此赋值是成功的。
	writer = f

	// 使用DataWriter接口进行数据写入
	writer.WriteData("data")
}

//Go语言的接口实现是隐式的，无须让实现接口的类型写出实现了哪些接口。这个设计被称为非侵入式设计。
